package momo.multitree.util;

import momo.multitree.structure.*;

import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import junit.framework.TestCase;

public class SpanTreeGeneratorTest extends TestCase
{
	public void testCase_1()
	{
		Node node1 = new Node("1", 1, 1);
		Node node2 = new Node("2", 1, 1);
		Node node3 = new Node("3", 1, 1);
		Node node4 = new Node("4", 1, 1);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node2, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node2, node4, 1, 1, 1, 1);
		Edge edge4 = new Edge("4", node1, node3, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node1, node4, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		
//		tester(graph);
	}
	
	public void testCase_2()
	{
		Node node1 = new Node("1", 1, 1);
		Node node2 = new Node("2", 1, 1);
		Node node3 = new Node("3", 1, 1);
		Node node4 = new Node("4", 1, 1);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node2, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node3, node4, 1, 1, 1, 1);
		Edge edge4 = new Edge("4", node4, node1, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node4, node2, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node3, node1, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		
//		tester(graph);
	}
	
	public void testCase_3()
	{
		Node node1 = new Node("1", 1, 1);
		Node node2 = new Node("2", 1, 1);
		Node node3 = new Node("3", 1, 1);
		Node node4 = new Node("4", 1, 1);
		Node node5 = new Node("5", 1, 1);
		Node node6 = new Node("6", 1, 1);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node2, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node3, node4, 1, 1, 1, 1);
		Edge edge4 = new Edge("4", node4, node5, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node5, node6, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node6, node2, 1, 1, 1, 1);
		Edge edge7 = new Edge("7", node3, node6, 1, 1, 1, 1);
		Edge edge8 = new Edge("8", node5, node3, 1, 1, 1, 1);
		Edge edge9 = new Edge("9", node4, node1, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		graph.add(edge7);
		graph.add(edge8);
		graph.add(edge9);
		
		tester(graph);
	}
	
	public void testCase_4()
	{
		Node node1 = new Node("1", 1, 1);
		Node node2 = new Node("2", 1, 1);
		Node node3 = new Node("3", 1, 1);
		Node node4 = new Node("4", 1, 1);
		Node node5 = new Node("5", 1, 1);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node2, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node3, node4, 1, 1, 1, 1);
		Edge edge4 = new Edge("4", node4, node5, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node5, node1, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node5, node2, 1, 1, 1, 1);
		Edge edge7 = new Edge("7", node5, node3, 1, 1, 1, 1);
		Edge edge8 = new Edge("8", node4, node1, 1, 1, 1, 1);
		Edge edge9 = new Edge("9", node4, node2, 1, 1, 1, 1);
		Edge edge10 = new Edge("10", node3, node1, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		graph.add(edge7);
		graph.add(edge8);
		graph.add(edge9);
		graph.add(edge10);
		
//		tester(graph);
	}
	
	public void testCase_5()
	{
		Node node1 = new Node("1", 1, 1);
		Node node2 = new Node("2", 1, 1);
		Node node3 = new Node("3", 1, 1);
		Node node4 = new Node("4", 1, 1);
		Node node5 = new Node("5", 1, 1);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node2, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node3, node4, 1, 1, 1, 1);
		Edge edge4 = new Edge("4", node3, node4, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node4, node1, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node4, node2, 1, 1, 1, 1);
		Edge edge7 = new Edge("7", node5, node1, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		graph.add(edge7);
		
		tester(graph);
	}
	
	private void tester(Graph graph)
	{
		SpanTreeGenerator gen[] = new SpanTreeGenerator[2];
		gen[0] = new CompactAlgo();
		gen[1] = new CombinationAlgo();
		
		Collection<Tree> c1 = gen[0].enumerateAllSpanningTree(graph);
		Collection<Tree> c2 = gen[1].enumerateAllSpanningTree(graph);
		Vector<Tree> v1 = new Vector<Tree>(c1);
		Vector<Tree> v2 = new Vector<Tree>(c2);
		
		System.out.println("v1: " + v1.size());
		System.out.println("v2: " + v2.size());
		
		assertEquals(v1.size(), v2.size());
		for(Tree g1: v1)
		{
			Tree curG = null;
			for(Tree g2: v2)
			{
				if ( g2.compare(g1) )
					curG = g2;
			}
			if ( curG == null )
				//fail();
				System.out.println(g1.toString());
			else
				v2.remove(curG);
		}
	}
	
}
